﻿package net.ojbk.saishi.service;

import net.ojbk.database.DatabaseConnection;
import net.ojbk.po.Email;
import net.ojbk.saishi.dao.UserDataDaoV2;
import net.ojbk.saishi.dao.syMatchDao;
import net.ojbk.saishi.dao.syMatchPartDao;
import net.ojbk.saishi.po.*;
import net.ojbk.saishi.util.ExcelTool;
import net.ojbk.util.EmailTool;

import java.io.File;
import java.util.Date;
import org.apache.commons.lang3.ArrayUtils; 
 
/**
 * 主办方 Service
 * 
 * @author twobox
 *
 */
public class sponsorService {
	
	/**
	 * 获取 所有 发布的信息
	 * @return
	 */
	public static syMatch[] getAllHoldMatch(String userId) { // yes √
		DatabaseConnection dbcon = new DatabaseConnection();
		syMatchDao smd=new syMatchDao(dbcon);
		syMatch[] sm = smd.queryAllRecodByUserId(userId);
		dbcon.close();
		return sm;
	}
	
	/**
	 * 功能：发布一条赛事，用于发布一项赛事
	 * 需求：
	 * 1、sym 将传入 赛事标题\赛事介绍\赛事密码\结束时间\文件名格\是否需要材料\serId
	 * 2、需要基本的信息 额外的信息 以字符串数组   ok
	 * 3、需要 "生成 一个 "唯一 的 赛事ID ok
	 * 4 、需要生成 开始时间    ok
	 * 5、 增加创建Excel
	 * @return 0:异常错误 1:成功
	 */
	public static int holdMatch (syMatch sym, String[] basicInfo, String[] extraInfo, String matchId) { // no
		int flag = 0;
		DatabaseConnection dbcon = new DatabaseConnection();
		String basicInfos = net.ojbk.util.StringTool.toOneString(basicInfo);
		String extraInfos = net.ojbk.util.StringTool.toOneString(extraInfo);
		sym.setBasicInfo(basicInfos);   //写入基本信息字符串
		sym.setExtraInfo(extraInfos);   //写入额外信息字符串
		syMatchDao smd=new syMatchDao(dbcon);
		sym.setMatchId(matchId);    //设置matchId
		// java Date 到mysql Date  好东西
		sym.setBeginTime(new java.sql.Timestamp(new Date().getTime()));  //写入开始时间
		boolean flag2=smd.addOneRecord(sym);  //写入数据库
		String[] info = (String[]) ArrayUtils.addAll(basicInfo, extraInfo);
		
 		String excelPath = MatchBackService.getExcelPath(sym.getUserId(),sym.getMatchId());
		File excelPathFile = new File(excelPath);
		System.out.println("\nexcelPathFile : " + excelPathFile.getPath());
		// 没有文件夹 创建文件夹
		if (!excelPathFile.getParentFile().exists())
			excelPathFile.getParentFile().mkdirs();
	    try {
	    	ExcelTool.createExcelOfStudents("Info", info, excelPath);
		} catch (Exception e) {
			e.printStackTrace();
		}
	    // 发送邮件
	    	// 获取 邮箱地址
	    UserDataDaoV2 udDaov2 = new UserDataDaoV2(dbcon);
		Email email=new Email();
		email.setToEmail(udDaov2.getEmailByUserId(sym.getUserId()));
		email.setTitle("师易信息科技有限公司 成功发布赛事");
		String emailContent = "发布者(id)：" + sym.getUserId() 
		+ "\n赛事标题：" + sym.getTitle()
		+ "\n赛事密码：" + sym.getPw()
		+ "\n需要文件：" + sym.getNeedFile()
		+ (sym.getNeedFile() ? "\n件名格式：" + sym.getFileFormat() : "")
		+ "\n赛事链接：" + "http://localhost:8080/saishi_shiyi_ojbk/saishi.jsp?matchId=" + matchId
		+ "\n开始时间：" + new java.sql.Timestamp(sym.getBeginTime().getTime())
		+ "\n结束时间：" + new java.sql.Timestamp(sym.getEndTime().getTime())
		+ "\n所需基本信息：" + sym.getBasicInfo().replaceAll("@@@", " ")
		+ "\n所需额外信息：" + (sym.getExtraInfo()==null || sym.getExtraInfo().equals("") || sym.getExtraInfo().equals("null")
		? "无额外获取信息" : sym.getExtraInfo().replaceAll("@@@", " ")
		+ "\n赛事内容：" + sym.getContent());
		email.setContent(emailContent);
		EmailTool.sendEmail(email);
	    
		if(flag2)
			flag=1;
		dbcon.close();
		return flag;
	}
	
	/**
	 * 描述：撤销一条赛事，用于赛事的撤销删除
	 * 需求：
	 * 1、删除 syMatch中赛事记录
	 * 2、删除 syMatchPart 中所有相关参赛记录
	 * @param matchId
	 * @return
	 */
	public static int revokeOneMatch(String matchId) {  //yes
		int i;
		// TODO 删除文件夹
		DatabaseConnection dbcon = new DatabaseConnection();
		syMatch sym=new syMatch();
		sym.setMatchId(matchId);
		syMatchDao symd=new syMatchDao(dbcon);
		// 判断 是否 存在
		if (!symd.checkOneRecord(matchId)) {
			dbcon.close();
			return 0;
		}
		boolean flag=symd.deleteOneRecord(sym);
		syMatchPartDao sympd=new syMatchPartDao(dbcon);
		syMatchPart symp[];
		symp=sympd.queryAllRecodByMatchId(matchId);
		for(i=0;i<symp.length;i++) {
			sympd.deleteOneRecord(symp[i]);
		}
		dbcon.close();
		if (flag)
			return 1;
		return 0;
	}
	
	/**
	 * 描述：修改赛事密码
	 * @param matchId 赛事id
	 * @param newPw 赛事新的密码
	 * @return
	 */
	public static int modifyPw(String matchId, String newPw) {  //yes
		DatabaseConnection dbcon = new DatabaseConnection();
		syMatch sm=new syMatch();
		sm.setMatchId(matchId);
		syMatchDao smd=new syMatchDao(dbcon);
		if(!smd.queryOneRecord(sm)) {
			dbcon.close();
			return 2;  //未查询到对应的赛事id
		}
		if(newPw.length()>6) {
			return 3;  //密码长度大于6
		}
		sm.setPw(newPw);
		if(!smd.updateOneRecord(sm)) {
			dbcon.close();
			return 4;   //修改密码失败
		}
		dbcon.close();
		return 1;
	}
	
	/**
	 * 描述：修改赛事结束时间
	 * 需求：
	 * 1、赛事结束时间须在开始时间之后
	 * 2、结束时间须在当前时间之后
	 * @param matchId
	 * @param newEndTime
	 * @return
	 */
	public static int modifyEndTime(String matchId, Date newEndTime) {   //yes
		DatabaseConnection dbcon=new DatabaseConnection();
		syMatchDao smd=new syMatchDao(dbcon);
		syMatch sym=new syMatch();
		sym.setMatchId(matchId);
		if(!smd.queryOneRecord(sym)) {
			return 2;   //未查询到对应的赛事
		}
		Date day=new Date();    //获取当前时间
		Date beginTime=sym.getBeginTime();
		if(newEndTime.before(beginTime)) {
			return 3;   //新结束时间比开始时间早
		}
		if(newEndTime.before(day)) {
			return 4;    //新结束时间比当前时间早
		}
		sym.setEndTime(newEndTime);
		smd.updateOneRecord(sym);
		dbcon.close();
		return 1;    //修改成功
	}
	
	/**
	 * 描述：立即关闭赛事报名
	 * 需求：
	 * 1、设置赛事结束时间为当前时刻
	 * @return
	 */
	public static int endMatch(String matchId) {    //yes
		DatabaseConnection dbcon=new DatabaseConnection();
		syMatchDao smd=new syMatchDao(dbcon);
		syMatch sm=new syMatch();
		sm.setMatchId(matchId);
		if(!smd.queryOneRecord(sm)) {
			return 2;   //未查询到对应的赛事Id
		}
		Date day=new Date(); 
		java.sql.Timestamp date=new java.sql.Timestamp(day.getTime());
		sm.setEndTime(date);  //写入结束时间
		if(!smd.updateOneRecord(sm)) {
			return 3;  //修改时间失败
		}
		dbcon.close();
		return 1;
	}
	public static void main(String[] args) {
	}
}
